package medium.array;

import java.util.Arrays;
import java.util.List;

/**
 * <a href="https://leetcode-cn.com/problems/minimum-time-to-collect-all-apples-in-a-tree">1443. 收集树上所有苹果的最少时间</a>
 * 给你一棵有 n 个节点的无向树，节点编号为 0 到 n-1 ，它们中有一些节点有苹果。通过树上的一条边，需要花费 1 秒钟。你从 节点 0 出发，请你返回最少需要多少秒，可以收集到所有苹果，并回到节点 0 。
 * 无向树的边由 edges 给出，其中 edges[i] = [fromi, toi] ，表示有一条边连接 from 和 toi 。除此以外，还有一个布尔数组 hasApple ，其中 hasApple[i] = true 代表节点 i 有一个苹果，否则，节点 i 没有苹果。
 * 示例 1：
 *   输入：n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,true,true,false]
 *   输出：8
 *   解释：上图展示了给定的树，其中红色节点表示有苹果。一个能收集到所有苹果的最优方案由绿色箭头表示。
 * 示例 2：
 *   输入：n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,false,true,false]
 *   输出：6
 *   解释：上图展示了给定的树，其中红色节点表示有苹果。一个能收集到所有苹果的最优方案由绿色箭头表示。
 * 示例 3：
 *   输入：n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,false,false,false,false,false]
 *   输出：0
 * 提示：
 *   1 <= n <= 10^5
 *   edges.length == n-1
 *   edges[i].length == 2
 *   0 <= fromi, to<sub>i</sub> <= n-1
 *   fromi < to<sub>i</sub>
 *   hasApple.length == n
 * @author 刘学松
 * @date 2021-04-15 16:51
 */
public class 收集树上所有苹果的最少时间 {
    public static void main(String[] args) {
        int n = 5;
        int[][] edges = {{0,1}, {0,2}, {1,3}, {0,4}};
        List<Boolean> hasApple = Arrays.asList(false, false, false, true, false);
        System.out.println(minTime(n, edges, hasApple));
    }

    public static int minTime(int n, int[][] edges, List<Boolean> hasApple) {
        // TODO
        int count = 0;
        for (int i = n-1; i > 0; i--) {
            Boolean has = hasApple.get(i);
            if (has) {
                for (int j = i - 1; j > 0; j--) {
                    if (edges[j][1] == i) {
                        hasApple.set(edges[j][0], true);
                        break;
                    }
                }
            }
        }
        for (int i = 1; i < n; i++) {
            if (hasApple.get(i)) {
                count++;
            }
        }

        return count*2;
    }
}
